import { Injectable, UnauthorizedException } from '@nestjs/common';
import { Request } from 'express';
import { UserService } from '../user/user.service';
import { JwtService } from '@nestjs/jwt';
import { LoginDto } from './dto/login.dto';
import { CreateUserDto } from '../user/dto/create-user.dto';
import { jwtConstants } from './constants';
import { verifyText } from '../../utils/bcryptjs/index';
// 身份验证
@Injectable()
export class AuthService {
  // 注入服务
  constructor(
    private readonly userService: UserService,
    private readonly jwtService: JwtService,
  ) {}

  // 登录
  async login(data: LoginDto) {
    const user = await this.userService.findOenByUsername(data.username);
    if (!user) {
      throw new UnauthorizedException('用户名或密码错误！');
    }
    // 密码对比
    const compare: boolean = verifyText(data.password, user.password);
    // console.log('密码对比:==>', compare);
    // 密码不正确
    if (!compare) throw new UnauthorizedException('用户名或密码错误！');
    // console.log('登录用户:==>', user);

    const payload = { uid: user.id, username: user.username };

    
    return {
      accessToken: await this.jwtService.signAsync(payload),
      expiresIn: jwtConstants.expiresIn,
    };
  }

  // 登出 TODO
  /** 
   * 存储一个所谓的“黑名单”所有Token是有效的，还没有到期你可以挑选一个拥有TTL功能的数据库，TTL被用于为Token记录Token过期之前剩余的时间量。
   * Redis 是一个很好的选择，这将允许在内存中快速访问列表.
   * 然后，在某个中间件中，运行在每个授权请求上，你应该检查提供的令牌是否在黑名单中🕵️‍，
   * 如果在的话就抛出一个未认证异常，如果没有让它通过，JWT验证将处理它并确定它是否已过期或仍然有效。
   */
  async logout(request: Request) {
    const token = request.headers?.authorization || '';
    console.log('登出:==>', token);
    // const res = await this.jwtService
  }

  // 注册用户
  async register(createDto: CreateUserDto) {
    return await this.userService.create(createDto);
  }

  // 获取登录用户信息
  async getUserInfo(uid: string) {
    console.log('auth.service-getUserInfo', uid);
    if (!uid) return null;
    return await this.userService.findOne(uid);
  }
}
